/**
 * @file rtsp.h
 * @brief 
 * @author LWL (lwl510ll@163.cn)
 * @version 1.0
 * @date 2025-05-26
 * 
 * @copyright Copyright (c) 2025  LWL
 * 
 */

#ifndef __RTSP_RTSP_H__
#define __RTSP_RTSP_H__

#include <string>
#include <sys/socket.h>  // 添加: 包含socket头文件
#include <vector>
#include <sys/select.h>
#include <unistd.h>
#include <pthread.h>
#include <sstream> // Add missing header for istringstream


class Rtsp {
private:
    int port;
    std::string addr;
    int sockfd;  // 添加: 用于存储socket文件描述符
public:
    Rtsp();
    ~Rtsp();
    int init(int port, const std::string& addr = ""); // 使用默认参数
    int tcp_init();  // 添加: 声明TCP初始化函数
    int get_sockfd();
};

struct RtspRequest {
    std::string method;
    std::string uri;
    std::string version;
    int cseq;
};

class RtspProtocol {
private:
    static RtspProtocol *instance;
    std::vector<int> sockfd;  // 添加: 用于存储socket文件描述符
    std::vector<int> tcp_server_fd;
    fd_set readfds;
    struct timeval timeout;
    pthread_t thread_id;

public:
    RtspProtocol();
    ~RtspProtocol();
    int add_sockfd(int fd);  // 添加: 声明初始化函数
    int add_tcp_server_fd(int fd);  // 添加: 声明初始化函数
    void* process(void* arg);
    int parser(int sockfd);
    std::string get_local_ip(int sockfd);
    bool parse_rtsp_request(const std::string& request, RtspRequest& out);
    int start();
    int stop();

    std::string request_deal(int sockfd, int seq, std::string method);
    std::string option_request_deal(int sockfd, int seq);
    std::string describe_request_deal(int sockfd, int seq);
    std::string setup_request_deal(int sockfd, int seq);
    std::string play_request_deal(int sockfd, int seq);

    static RtspProtocol *get_instance();
};

#endif /* __RTSP_RTSP_H__ */